import json
from .models import DataView
from .tools import execute_data_view
# 假设你有一个LLM服务类
from .llm_service import LLMService 

class DjangoAgent:
    def __init__(self):
        self.llm = LLMService() # 初始化你的LLM API调用服务

    def _get_available_tools_prompt(self):
        """生成一个描述所有可用工具（DataView）的字符串，供LLM参考。"""
        tools_description = "你拥有以下可以调用的工具（能力）：\n"
        for view in DataView.objects.all():
            tools_description += (
                f"- 工具名称: `{view.name}`\n"
                f"  - 功能描述: {view.description}\n"
                f"  - 需要参数: {json.dumps(view.required_params, ensure_ascii=False)}\n\n"
            )
        return tools_description

    def run(self, user_instruction: str) -> str:
        # ---- 步骤2 & 3: 第一次LLM调用，识别意图，选择工具 ----
        planner_prompt = f"""
        你是一个智能数据助手。你的任务是理解用户的指令，并从可用工具列表中选择最合适的工具来完成任务。
        请根据用户的指令，决定调用哪个工具，并提取出执行该工具所需的参数。

        {self._get_available_tools_prompt()}

        用户的指令是: "{user_instruction}"

        你的输出必须是一个JSON对象，格式如下:
        {{
          "tool_name": "选择的工具名称",
          "parameters": {{ "参数1": "值1", "参数2": "值2" }}
        }}
        """
        
        # 假设self.llm.invoke返回的是一个JSON字符串
        llm_response_str = self.llm.invoke(planner_prompt)
        try:
            action = json.loads(llm_response_str)
            tool_name = action.get("tool_name")
            parameters = action.get("parameters")
        except (json.JSONDecodeError, AttributeError):
            return "对不起，我无法解析您的指令，请换一种方式提问。"

        if not tool_name:
            return "对不起，根据您的指令，我没有找到合适的工具来执行。"

        # ---- 步骤4 & 5 & 6: 执行安全工具，获取原始数据 ----
        raw_data_result = execute_data_view(tool_name, parameters)

        if raw_data_result.get("error"):
            return f"在执行任务时遇到错误: {raw_data_result['error']}"
        
        # ---- 步骤7: 第二次LLM调用，分析数据，生成最终答案 ----
        raw_data = raw_data_result.get("data")
        analyzer_prompt = f"""
        你是一个数据分析专家。你已经获取到了以下原始数据：
        {json.dumps(raw_data, indent=2, ensure_ascii=False)}

        请根据这些数据，回答用户最初的问题。
        用户的最初问题是: "{user_instruction}"

        请用自然、流畅的中文进行总结和回答。
        """
        
        final_answer = self.llm.invoke(analyzer_prompt)
        